package ar.republicagroup.gestion.dao.jpa;

import ar.republicagroup.gestion.dao.BancoDAO;
import ar.republicagroup.gestion.entities.Banco;
import ar.republicagroup.gestion.util.JComboBoxModel;
import ar.republicagroup.gestion.util.JPAUtil;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.swing.DefaultComboBoxModel;
import org.apache.log4j.Logger;

public class BancoDAOImplJPA implements BancoDAO{

	private EntityManager		 em;
        private Logger log = Logger.getLogger(BancoDAOImplJPA.class);
	
	public BancoDAOImplJPA() {
		em = JPAUtil.getEntityManager();
	}

	@Override
	public List<Banco> findEntities() {
		TypedQuery<Banco> query = em.createQuery("select b From Banco b WHERE b.estado = 1",Banco.class);
		return query.getResultList();
	}

	@Override
	public String insert(Banco beanBanco) {
		String resultado = null;
		
		try{
			em.getTransaction().begin();
			em.persist(beanBanco);
			em.getTransaction().commit();
			resultado = "Se registro el banco";
		}catch(Exception ex){
			em.getTransaction().rollback();
			log.error("Error al insertar banco", ex);
			
		}
	
		return resultado;
	}

	@Override
	public String update(Banco beanBanco) {
			String resultado = null;
		
			/* BUSCAMOS EL BANCO PARA SETEARLE LOS DATOS */
		Banco mergeBanco 		= em.find(Banco.class, beanBanco.getId());
		
		if (mergeBanco!=null){
			/* SETEAMOS LOS DATOS MODIFICADOS en mergeBanco*/
		mergeBanco.setCodigoCuenta(beanBanco.getCodigoCuenta());
		mergeBanco.setNombre(beanBanco.getNombre());
		mergeBanco.setTelefono(beanBanco.getTelefono());
		mergeBanco.setDireccion(beanBanco.getDireccion());
		mergeBanco.setCodigoPostal(beanBanco.getCodigoPostal());
		
		}
		
                        try {
				em.getTransaction().begin();
				em.merge(mergeBanco);	
				em.getTransaction().commit();
				resultado = "banco actualizado";
			}catch(Exception ex){
				em.getTransaction().rollback();
				log.error("Error al actualizar banco", ex);
			}
		
		return resultado;
	}

	@Override
	public Banco get(Integer idbanco) {
		return em.find (Banco.class, idbanco);
	}

	@Override
	public String delete(Integer idbanco) {
		String resultado = null;
				
				/* BUSCAMOS EL CLIENTE PARA SETEARLE LOS DATOS */
				Banco deleteBanco 		= em.find(Banco.class, idbanco);
				deleteBanco.setEstado(0);		//<--- Eliminaci�n l�gica , estado = 0
				
				/* HACEMOS UN MERGE DE deleteBanco*/
				try{
						em.getTransaction().begin();
						em.merge(deleteBanco);	
						em.getTransaction().commit();
						resultado = "banco eliminado";
					}catch(Exception ex){
						em.getTransaction().rollback();
						log.error("Error al eliminar banco", ex);
					}
				
				return resultado;
	}
	
	
	@Override
	public Banco findBancoByName(String banco_name) {
		Query query 			= em.createQuery("select b from Banco b WHERE b.nombre = ?1");
		query.setParameter(1, banco_name);
		Banco banco 	= (Banco)query.getSingleResult();
		return banco;
	}

	@Override
	public Banco findBancoByCodCuenta(String cod_cuenta, boolean es_sucursal) {
		String sql;
		Banco  banco;
		if (es_sucursal){
			sql = "select b from Banco b WHERE b.codigoCuenta = ?1 AND b.sucursalId is not null";
		}else{
			sql = "select b from Banco b WHERE b.codigoCuenta = ?1 AND b.sucursalId is null";
		}
		
                        Query query				= em.createQuery(sql);
                        query.setParameter(1, cod_cuenta);
		
                try
                {
                     banco				= (Banco)query.getSingleResult();
                }catch(Exception ex){
                        log.error(ex.getMessage());
                        return null;
                }
                
                return banco;	
	}
	

	@Override
	public Banco findSucursalByCodCuenta(String cod_cuenta, Integer sucursal_id) {
		String sql				= "SELECT b FROM Banco b WHERE b.codigoCuenta = ?1 AND b.banco.id = ?2";
		Query query				= em.createQuery(sql);
		query.setParameter(1, cod_cuenta);
		query.setParameter(2, sucursal_id.intValue());
		Banco banco				= (Banco)query.getSingleResult();
		return banco;
		
	}



    @Override
    public DefaultComboBoxModel combo() {
        Query query             = em.createQuery("SELECT b FROM Banco b WHERE b.estado = 1",Banco.class);
        List<Banco> bancoList   = query.getResultList();
        DefaultComboBoxModel model = new DefaultComboBoxModel();
        for(Banco banco : bancoList){
            model.addElement(new JComboBoxModel(banco.getId().toString(), banco.getNombre()));
        }
        
        return model;
        
        
    }

	
	
	
	
	
	
	

}
